package Compation;

/**
 * 1330. 翻转子数组得到最大的数组值
 * 给你一个整数数组 nums 。「数组值」定义为所有满足 0 <= i < nums.length-1 的 |nums[i]-nums[i+1]| 的和。
 *
 * 你可以选择给定数组的任意子数组，并将该子数组翻转。但你只能执行这个操作 一次 。
 *
 * 请你找到可行的最大 数组值 。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [2,3,1,5,4]
 * 输出：10
 * 解释：通过翻转子数组 [3,1,5] ，数组变成 [2,5,1,3,4] ，数组值为 10 。
 * 示例 2：
 *
 * 输入：nums = [2,4,9,24,2,1,10]
 * 输出：68
 *
 *
 * 提示：
 *
 * 1 <= nums.length <= 3*10^4
 * -10^5 <= nums[i] <= 10^5
 */
public class maxValueAfterReverse {
    /**
     * 基本思路，双指针遍历整个数组，求边缘两个值变化最大的差值
     * @param nums 输入数组
     * @return 最大 数组值
     */
    public int maxValueAfterReverse(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int curSum = 0;
        for (int i = 1; i < nums.length; i++) {
            curSum += Math.abs(nums[i - 1] - nums[i]);
        }
        int maxDifference = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (i == 0) {
                    if (j != nums.length - 1) {
                        int changedMinus = Math.abs(nums[i] - nums[j + 1]);
                        int curMinus = Math.abs(nums[i] - nums[j + 1]);
                        maxDifference = Math.max(maxDifference, changedMinus - curMinus);
                    }
                } else if (j == nums.length - 1) {
                    int changedMinus = Math.abs(nums[i - 1] - nums[j]);
                    int curMinus = Math.abs(nums[i - 1] - nums[i]);
                    maxDifference = Math.max(maxDifference, changedMinus - curMinus);
                } else {
                    int changedMinus = Math.abs(nums[i] - nums[j + 1]) + Math.abs(nums[i - 1] - nums[j]);
                    int curMinus = Math.abs(nums[i - 1] - nums[i]) + Math.abs(nums[j] - nums[j + 1]);
                    maxDifference = Math.max(maxDifference, changedMinus - curMinus);
                }
            }
        }
        return maxDifference + curSum;
    }
}
